const webpack = require('webpack');
const path = require('path');
function resolve(dir) {
  return path.join(__dirname, dir);
}
const { codeInspectorPlugin } = require('code-inspector-plugin');
module.exports = {
  lintOnSave: false, //关闭eslint保存检测
  productionSourceMap: false, //意味着在生产环境中不生成source map文件 这有助于减少构建后的代码体积和保护源代码的安全性
  devServer: {
    disableHostCheck: true, //webpack devServer将禁用主机检查，允许使用非本地主机进行调试和开发
    port: process.env.DEV_SERVER_PORT || 8080,
    proxy: {
      '^/api': {
        // target: 'https://music.163.com',
        target: 'http://localhost:3000',
        changeOrigin: true, //用于指示目标服务器是否改变请求的源信息，将 Host 请求头的原点更改为目标 URL
        pathRewrite: {
          '^/api': '/', //pathRewrite 配置对象中的 '^/api': '/' 指定了将以 /api 开头的请求路径重写为根路径 /   /api/login 重写为 http://localhost:3000/login
        },
      },
    },
  },
  pwa: {
    name: 'YesPlayMusic',
    iconPaths: {
      favicon32: 'img/icons/favicon-32x32.png',
    },
    themeColor: '#ffffff00',
    manifestOptions: {
      background_color: '#335eea',
    },
    // workboxOptions: {
    //   swSrc: "dev/sw.js",
    // },
  },
  pages: {
    index: {
      entry: 'src/main.js',
      template: 'public/index.html',
      filename: 'index.html',
      title: 'YesPlayMusic',
      chunks: ['main', 'chunk-vendors', 'chunk-common', 'index'],
    },
  },
  chainWebpack(config) {
    config.module.rules.delete('svg'); //: 删除原有的针对SVG文件的规则
    config.module.rule('svg').exclude.add(resolve('src/assets/icons')).end(); //: 排除src/assets/icons目录，不处理svg文件。
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/assets/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]',
      })
      .end(); //: 处理svg文件，使用svg-sprite-loader插件。
    config.module
      .rule('napi') //定义了一个名为 "napi" 的自定义规则，用于配置 webpack 处理特定类型的文件
      .test(/\.node$/)
      .use('node-loader')
      .loader('node-loader')
      .end(); //指定对.node文件使用node-loader进行加载。
    config.module
      .rule('webpack4_es_fallback')
      .test(/\.js$/)
      .include.add(/node_modules/)
      .end()
      .use('esbuild-loader')
      .loader('esbuild-loader')
      .options({
        target: 'es2015',
        format: 'cjs',
      })
      .end();
    // LimitChunkCountPlugin 可以通过合并块来对块进行后期处理。用以解决 chunk 包太多的问题
    config.plugin('chunkPlugin').use(webpack.optimize.LimitChunkCountPlugin, [
      {
        maxChunks: 3,
        minChunkSize: 10_000,
      },
    ]);
    config
      .plugin('code-inspector-plugin')
      .use(codeInspectorPlugin({ bundler: 'webpack' }));
  },
  // 添加插件的配置
  pluginOptions: {
    // electron-builder的配置文件
    electronBuilder: {
      nodeIntegration: true,
      externals: ['@unblockneteasemusic/rust-napi'],
      builderOptions: {
        productName: 'YesPlayMusic',
        copyright: 'Copyright © YesPlayMusic', // compression: "maximum", // 机器好的可以打开，配置压缩，开启后会让 .AppImage 格式的客户端启动缓慢
        asar: true, //asar（Atom Shell Archive）是Electron框架中用于打包应用程序文件的一种格式。当asar设置为true时，应用程序文件将会被打包成一个单一的归档文件，这有助于提高应用程序的加载和启动速度
        publish: [
          {
            provider: 'github',
            owner: 'qier222',
            repo: 'YesPlayMusic',
            vPrefixedTagName: true,
            releaseType: 'draft',
          },
        ],
        directories: {
          output: 'dist_electron',
        },
        mac: {
          target: [
            {
              target: 'dmg',
              arch: ['x64', 'arm64', 'universal'],
            },
          ],
          artifactName: '${productName}-${os}-${version}-${arch}.${ext}',
          category: 'public.app-category.music',
          darkModeSupport: true,
        },
        win: {
          target: [
            {
              target: 'portable',
              arch: ['x64'],
            },
            {
              target: 'nsis',
              arch: ['x64'],
            },
          ],
          publisherName: 'YesPlayMusic',
          icon: 'build/icons/icon.ico',
          publish: ['github'],
        },
        linux: {
          target: [
            {
              target: 'AppImage',
              arch: ['x64'],
            },
            {
              target: 'tar.gz',
              arch: ['x64', 'arm64'],
            },
            {
              target: 'deb',
              arch: ['x64', 'armv7l', 'arm64'],
            },
            {
              target: 'rpm',
              arch: ['x64'],
            },
            {
              target: 'snap',
              arch: ['x64'],
            },
            {
              target: 'pacman',
              arch: ['x64'],
            },
          ],
          category: 'Music',
          icon: './build/icon.icns',
        },
        dmg: {
          icon: 'build/icons/icon.icns',
        },
        nsis: {
          //针对windows的安装包配置
          oneClick: true, //当安装程序运行时，用户只需单击一次即可完成整个安装过程，无需进一步交互。
          perMachine: true, //安装程序安装为适用于计算机的程序，而不是仅适用于当前用户
          deleteAppDataOnUninstall: true, //在卸载应用程序时，删除应用程序数据。
        },
      },
      // 主线程的配置文件
      chainWebpackMainProcess: config => {
        //首先使用config.plugin('define')添加一个插件，利用tap方法来修改插件的参数，将IS_ELECTRON设置为true。
        config.plugin('define').tap(args => {
          args[0]['IS_ELECTRON'] = true;
          return args;
        });
        // 然后使用config.resolve.alias.set方法来设置别名，将jsbi指向node_modules/jsbi/dist/jsbi-cjs.js。
        config.resolve.alias.set(
          'jsbi', //jsbi是JavaScript BigInt的简称，它是在ECMAScript 2020标准中引入的一种新的数据类型，用于表示任意精度的整数
          path.join(__dirname, 'node_modules/jsbi/dist/jsbi-cjs.js')
        );

        config.module
          .rule('webpack4_es_fallback')
          .test(/\.js$/)
          .include.add(/node_modules/)
          .end()
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({ target: 'es2015', format: 'cjs' })
          .end();
      },
      // 渲染线程的配置文件
      chainWebpackRendererProcess: config => {
        // 渲染线程的一些其他配置
        // 仅用于电子渲染器进程的链 webpack 配置
        // 以下示例将在您的应用程序中将 IS_ELECTRON 设置为 true
        config.plugin('define').tap(args => {
          args[0]['IS_ELECTRON'] = true;
          return args;
        });
      },
      // 主入口文件
      // mainProcessFile: 'src/main.js',
      // mainProcessArgs: []
    },
  },
};
